package com.zll.study;


import java.util.Arrays;

public class QuanPaiLie {
    public static void main(String[] args) {
        int[] a = {1,2,3};
        f(a);
    }

    private static void f(int[] a) {
        f(a, 0);
    }

    /*
    思路： 把lock位置锁定，然后对后面的值进行全排列,
          后面的值还要一个一个的交换到lock位置进行锁定

    - 循环i，从lock开始，递增到结束
    - 把i位置的值交换到lock位置进行锁定
    - 对lock后面的数据进行全排列
    - 把lock位置的值交换到i位置，恢复数据顺序

    - 最简问题： lock==a.length-1，锁定了最后一个位置，得到了一个排列
               直接打印数组
     */
    private static void f(int[] a, int lock) {
        if (lock == a.length - 1) { //最后一层递归时锁定了最后一个值
            System.out.println(Arrays.toString(a));
            return;
        }

        for (int i = lock; i < a.length; i++) { //i变量负责把值向lock位置交换，进行锁定
            swap(a, i, lock);   //i位置的值交换到lock位置锁定
            f(a, lock+1);       //递归，对lock之后的数据进行全排列
            swap(a, i, lock);   //恢复数据顺序，未下一次交换做准备
        }
    }

    private static void swap(int[] a, int i, int lock) {
        int t = a[i];
        a[i] = a[lock];
        a[lock] = t;

        Arrays.sort(new int[]{});
        Arrays.sort(new String[]{});
    }
}

